From 789bec4724e4633eb2668cfd0124e789c5d8000d Mon Sep 17 00:00:00 2001 From: "Liu, Jinsong" Date: Sat, 23 Jul 2011 08:56:58 +0100 Subject: [PATCH] x86, mce: Dump mce log by ERST when mc panic We have implemented basic ERST logic before. Now linux3.0 as dom0 has included APEI logic. Hence it's time to add mce apei interface and enable APEI ERST feature. With it, it can save mce log by ERST method when mc panic. Signed-off-by: Liu, Jinsong --- xen/arch/x86/cpu/mcheck/mce.c | 27 ++++++++++++++++++++++++++- xen/arch/x86/cpu/mcheck/mce.h | 2 ++ xen/arch/x86/cpu/mcheck/mce_intel.c | 1 + 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/cpu/mcheck/mce.c b/xen/arch/x86/cpu/mcheck/mce.c index 030fc54070..e6626d9883 100644 --- a/xen/arch/x86/cpu/mcheck/mce.c +++ b/xen/arch/x86/cpu/mcheck/mce.c @@ -919,6 +919,28 @@ void *x86_mcinfo_add(struct mc_info *mi, void *mcinfo) return buf; } +static void x86_mcinfo_apei_save( + struct mcinfo_global *mc_global, struct mcinfo_bank *mc_bank) +{ + struct mce m; + + memset(&m, 0, sizeof(struct mce)); + + m.cpu = mc_global->mc_coreid; + m.cpuvendor = boot_cpu_data.x86_vendor; + m.cpuid = cpuid_eax(1); + m.socketid = mc_global->mc_socketid; + m.apicid = mc_global->mc_apicid; + + m.mcgstatus = mc_global->mc_gstatus; + m.status = mc_bank->mc_status; + m.misc = mc_bank->mc_misc; + m.addr = mc_bank->mc_addr; + m.bank = mc_bank->mc_bank; + + apei_write_mce(&m); +} + /* Dump machine check information in a format, * mcelog can parse. This is used only when * Dom0 does not take the notification. */ @@ -962,8 +984,11 @@ void x86_mcinfo_dump(struct mc_info *mi) printk("[%16"PRIx64"]", mc_bank->mc_misc); if (mc_bank->mc_status & MCi_STATUS_ADDRV) printk(" at %16"PRIx64, mc_bank->mc_addr); - printk("\n"); + + if (is_mc_panic) + x86_mcinfo_apei_save(mc_global, mc_bank); + next: mic = x86_mcinfo_next(mic); /* next entry */ if ((mic == NULL) || (mic->size == 0)) diff --git a/xen/arch/x86/cpu/mcheck/mce.h b/xen/arch/x86/cpu/mcheck/mce.h index 223c17b2b9..14f7a40d68 100644 --- a/xen/arch/x86/cpu/mcheck/mce.h +++ b/xen/arch/x86/cpu/mcheck/mce.h @@ -210,4 +210,6 @@ struct mce { __u64 mcgcap; /* MCGCAP MSR: machine check capabilities of CPU */ }; +extern int apei_write_mce(struct mce *m); + #endif /* _MCE_H */ diff --git a/xen/arch/x86/cpu/mcheck/mce_intel.c b/xen/arch/x86/cpu/mcheck/mce_intel.c index 0df6d72b93..d6d4bb99ab 100644 --- a/xen/arch/x86/cpu/mcheck/mce_intel.c +++ b/xen/arch/x86/cpu/mcheck/mce_intel.c @@ -283,6 +283,7 @@ static int mce_delayed_action(mctelem_cookie_t mctc) { case MCER_RESET: dprintk(XENLOG_ERR, "MCE delayed action failed\n"); + is_mc_panic = 1; x86_mcinfo_dump(mctelem_dataptr(mctc)); panic("MCE: Software recovery failed for the UCR\n"); break; -- 2.30.2